Skip to content

Conversation

@35C4n0r
Copy link
Collaborator

@35C4n0r 35C4n0r commented Jan 31, 2026

Closes: coder/internal#1256

MergeAfter: #172

@35C4n0r 35C4n0r self-assigned this Feb 1, 2026
@35C4n0r 35C4n0r marked this pull request as ready for review February 1, 2026 15:52
@35C4n0r 35C4n0r marked this pull request as draft February 1, 2026 15:52
@35C4n0r 35C4n0r changed the base branch from main to cj/refactor-conversation-orig February 3, 2026 08:51
@35C4n0r 35C4n0r marked this pull request as ready for review February 3, 2026 08:54
@35C4n0r 35C4n0r marked this pull request as draft February 3, 2026 08:54
@35C4n0r 35C4n0r closed this Feb 3, 2026
@35C4n0r 35C4n0r reopened this Feb 3, 2026
@github-actions
Copy link

github-actions bot commented Feb 3, 2026

✅ Preview binaries are ready!

To test with modules: agentapi_version = "agentapi_177" or download from: https://github.com/coder/agentapi/releases/tag/agentapi_177

@mafredri mafredri self-requested a review February 3, 2026 13:09
Copy link
Member

@mafredri mafredri left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice work so far! I left a few comments and suggestions. Mainly about moving some concerns from httpapi to cmd/server. I think it would be helpful to have some tests based on real agent session restoration output to evaluate the screentracker changes.

AllowedHosts: viper.GetStringSlice(FlagAllowedHosts),
AllowedOrigins: viper.GetStringSlice(FlagAllowedOrigins),
InitialPrompt: initialPrompt,
StatePersistenceCfg: httpapi.StatePersistenceCfg{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Naming Cfg -> Config (no previous precedent for Cfg in this repo).

}
}

pidFile := viper.GetString(PidFile)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: I think it'd make sense to move pid file handling here rather than httpapi as it becomes a bit disconnected and here we can write it early.

// Handle SIGUSR1 for save without exit
saveOnlyCh := make(chan os.Signal, 1)
signal.Notify(saveOnlyCh, syscall.SIGUSR1)
go func() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
go func() {
go func() {
defer signal.Stop(saveOnlyCh)

Suggestion: Good practice to unregister on teardown.

currentStatus = st.ConversationStatusChanging
s.logger.Info("Initial prompt sent successfully")
if !s.stateLoadComplete && s.statePersistenceCfg.LoadState {
_, _ = s.conversation.LoadState(s.statePersistenceCfg.StateFile)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not objecting, just curious. Why do we wait for stability to load the state?

s.cleanupPIDFile()

// Now close the process
if err := process.Close(s.logger, 5*time.Second); err != nil {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It feels a bit strange to control the process from this "far in". To me it would make sense to invert some of this control, i.e. change how things are wired up in cmd/server.

If we close here, won't we likely be logging an error in cmd/server due to the process being killed or some such? If so, we could improve the UX.

s.logger.Info("Saved conversation state", "source", source, "stateFile", s.statePersistenceCfg.StateFile)
}
} else {
s.logger.Warn("Save requested but state saving is not configured", "source", source)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Won't this print save requested for regular stop signals like SIGTERM? I think this log is only applicable for USR1.

func (s *Server) HandleSignals(ctx context.Context, process *termexec.Process) {
// Handle shutdown signals (SIGTERM, SIGINT only on Windows)
shutdownCh := make(chan os.Signal, 1)
signal.Notify(shutdownCh, os.Interrupt, syscall.SIGTERM)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this compile on Windows? IIRC we can only support os.Interrupt there.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

AgentAPI: State persistence

2 participants